#include "tableviewdialog.h"
#include "ui_tableviewdialog.h"

TableViewDialog::TableViewDialog(QAbstractTableModel *m, bool zero, QWidget *parent) :
    QDialog(parent),
    ui(new Ui::TableViewDialog)
{
    ui->setupUi(this);

    setModel(m);

    // On cache les group inutiles
    ui->groupIntervalle->setVisible(false);
    ui->groupRecherche->setVisible(false);

    afficheZero = zero;

}

TableViewDialog::~TableViewDialog()
{
    delete ui;
    delete model;
}

void TableViewDialog::setTitle(QString s)
{
    title = s;
}

void TableViewDialog::setHeaderLeft(QString s)
{
    headerLeft = s;
}

void TableViewDialog::setHeaderCenter(QString s)
{
    headerCenter = s;
}

void TableViewDialog::setHeaderRight(QString s)
{
    headerRight = s;
}

void TableViewDialog::setHeaderText(QString s)
{
    headerText = s;
}

void TableViewDialog::setFooterLeft(QString s)
{
    footerLeft = s;
}

void TableViewDialog::setFooterRight(QString s)
{
    footerRight = s;
}

void TableViewDialog::setFooterText(QString s)
{
    footerText = s;
}

void TableViewDialog::setTableFormat(const QList<QModelDataReport::dataFormat> &l)
{
    tableformat = l;
}

void TableViewDialog::setAlignment(const QList<int> &l)
{
    alignment = l;
}

void TableViewDialog::setListofWidth(const QList<int> &l)
{
    listofwidth = l;
}

void TableViewDialog::setListofHeaders(const QStringList &l)
{
    listofheader = l;
}

void TableViewDialog::setModel(QAbstractTableModel *m)
{
    // On enregistre le model
    model = m;

    model->setParent(this);

    // On l'aaffiche
    ui->tableView->setModel(model);

    // On initialise par defaut les listes pour l'impression
    int column = model->columnCount();

    for(int i = 0 ; i < column; i++)
        listofcolumns << i;

    ui->tableView->resizeColumnsToContents();

}

void TableViewDialog::hideColumn(int c)
{
    ui->tableView->hideColumn(c);

    int i = listofcolumns.indexOf(c);
    listofcolumns.takeAt(i);

}

void TableViewDialog::totalColumn(int c)
{
    listofcolumnsTotaux << c;
}

void TableViewDialog::setDelegateForColumn(int i, QAbstractItemDelegate *d)
{
    d->setParent(this);
    ui->tableView->setItemDelegateForColumn(i,d);
    ui->tableWidget->setItemDelegateForColumn(listofcolumns.indexOf(i),d);
    qDebug() << listofcolumns.indexOf(i);
}

void TableViewDialog::on_buttonQuitter_clicked()
{
    this->close();
}

void TableViewDialog::on_buttonImprimer_clicked()
{
    // Création de la classe rapport
    QModelDataReport *rapport = new QModelDataReport(model,this);

    // Initialisation des listes si vides

    int column = listofcolumns.count();

    if(listofheader.isEmpty()){
        for(int i = 0 ; i < column; i++)
            listofheader << model->headerData(listofcolumns.at(i),Qt::Horizontal).toString();
    }

    if(alignment.isEmpty()){
        alignment << (Qt::AlignLeft| Qt::AlignVCenter);
        for(int i = 1 ; i < column; i++)
            alignment << (Qt::AlignRight | Qt::AlignVCenter);
    }

    if(tableformat.isEmpty()){
        for(int i = 1 ; i < column; i++)
            tableformat << dformatstring();
    }

    if(listofwidth.isEmpty()){
        int defWidth = int(100 / column);
        listofwidth << 100 - defWidth*(column-1);
        for(int i = 1 ; i < column; i++)
            listofwidth << defWidth;
    }

    // On passe les listes en paramètres
    rapport->setListofColumns(&listofcolumns);
    rapport->setColumnWidthPercentage(&listofwidth);
    rapport->setListofColumnsHeader(&listofheader);
    rapport->setCellsAlignment(&alignment);
    rapport->setCellsDataFormat(&tableformat);

    rapport->setAfficheZero(afficheZero);

    QString footerTotaux ="";
    if(!listofcolumnsTotaux.isEmpty()){
        footerTotaux += "\nTotaux :";
        foreach (int i, listofcolumnsTotaux) {
            footerTotaux += "\n" + model->headerData(i,Qt::Horizontal).toString() + " : " +QString::number(ui->tableWidget->item(0,listofcolumns.indexOf(i))->data(Qt::DisplayRole).toDouble(),'f',2) + " €";
        }
    }

    if(ui->tableView->selectionModel()->selectedIndexes().count() > 0)
        rapport->setSelectionModel(ui->tableView->selectionModel());

    // Définition des polices
    QFont font = this->font();
        // Titre
    font.setPointSize(16);
    rapport->setTitleFont(font);
    rapport->setTitleText(title);
        // Corps
    font.setPointSize(8);
    rapport->setBodyFont(font);
        // Headers
    font.setPointSize(12);
    rapport->setHeaderPageFont(font);
    rapport->setHeaderPageLeftText(headerLeft);
    rapport->setHeaderPageCenterText(headerCenter);
    rapport->setHeaderPageRightText(headerRight);
        // Sous-titre
    font.setPointSize(12);
    rapport->setHeaderReportFont(font);
    rapport->setHeaderReportHeight(25);
    rapport->setHeaderReportText(headerText);
        // Pied
    font.setPointSize(12);
    rapport->setFooterPageFont(font);
    rapport->setFooterPageRightText(footerRight);
    rapport->setFooterPageLeftText(footerLeft);
        //fin
    rapport->setEndReportFont(font);
    rapport->setEndReportHeight(25+15+15*listofcolumnsTotaux.count());
    rapport->setEndReportText(footerText+footerTotaux);


    // Impression
    rapport->model_print();
}

void TableViewDialog::totaux()
{


    foreach (int c, listofcolumnsTotaux) {

        int j = listofcolumns.indexOf(c);

        double total = 0.0;
        double totalSelect = 0.0;
        bool emptySelection = true;

        for (int i = 0; i< model->rowCount() ; i++){

            total += model->index(i,c).data().toDouble();

            if(ui->tableView->selectionModel()->rowIntersectsSelection(i,QModelIndex())){
                totalSelect += model->index(i,c).data().toDouble();
                emptySelection = false;
            }
        }

        if(!emptySelection)
            total = totalSelect;

        QTableWidgetItem *newItem = new QTableWidgetItem(QString::number(total));
        ui->tableWidget->setItem(0,j,newItem);
    }
}

QModelDataReport::dataFormat TableViewDialog::dformatstring()
{
    QModelDataReport::dataFormat dformatstring;
    dformatstring.strFormat="%1";
    dformatstring.typeFormat=QModelDataReport::typeIsQString;
    dformatstring.fieldwidthFormat=0;
    dformatstring.fillFormat="";
    return dformatstring;
}

QModelDataReport::dataFormat TableViewDialog::dformatdate()
{

    QModelDataReport::dataFormat dformatdate;
    dformatdate.strFormat="%1";
    dformatdate.typeFormat=QModelDataReport::typeIsQDate;
    dformatdate.fieldwidthFormat=0;
    dformatdate.fillFormat="dd-MM-yy";
    return dformatdate;
}

QModelDataReport::dataFormat TableViewDialog::dformatdatetime()
{

    QModelDataReport::dataFormat dformatdatetime;
    dformatdatetime.strFormat="%1";
    dformatdatetime.typeFormat=QModelDataReport::typeIsQDateTime;
    dformatdatetime.fieldwidthFormat=0;
    dformatdatetime.fillFormat="dd-MM-yy HH:mm";
    return dformatdatetime;
}

QModelDataReport::dataFormat TableViewDialog::dformateuro()
{
    QModelDataReport::dataFormat dformateuro;
    dformateuro.strFormat="%1€";
    dformateuro.typeFormat=QModelDataReport::typeIsCurrency;
    dformateuro.fieldwidthFormat=12;
    dformateuro.fillFormat="";
    return dformateuro;
}

void TableViewDialog::showEvent(QShowEvent *event)
{

    ui->tableView->resizeColumnsToContents();

    ui->tableWidget->clear();
    ui->tableWidget->setRowCount(1);
    ui->tableWidget->setColumnCount(listofcolumns.count());

    foreach (int j, listofcolumns) {
        ui->tableWidget->setColumnWidth(listofcolumns.indexOf(j),ui->tableView->columnWidth(j));
    }

    totaux();

    connect(ui->tableView->selectionModel(),SIGNAL(selectionChanged(QItemSelection,QItemSelection)),this,SLOT(totaux()));

}
